package com.eastdigit.system.service;

import com.eastdigit.system.inter.MenuMapper;
import com.eastdigit.system.model.BusinessException;
import com.eastdigit.system.model.Constants;
import com.eastdigit.system.model.Menu;
import com.eastdigit.util.StringUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class MenuService extends BaseTreeService implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;
    @Autowired
    private IDataScopeService dataScopeService;

    /**
     * 获取树形菜单表格
     * 
     * @param userId
     * @return
     */
    @Override
    public JSONArray queryMenuTreeGrid(String userId) {
        JSONArray array = new JSONArray();
        // 对于001，能够查看所有的，否则只可看有效的
        List<Menu> list = Constants.SUPER_USER_ID.equals(userId) ? menuMapper.selectAll() : queryMenuOfUser(userId);
        for (Menu menu : list) {
            array.add(menu.toJSONObject());
        }

        return BaseTreeService.queryTreeGridFlat("menuId", "parentMenuId", array);
    }

    /**
     * 获取树形菜单
     * 
     * @param userId
     * @return
     */
    @Override
    public JSONArray queryMenuTree(String userId) {
        JSONArray array = new JSONArray();
        for (Menu menu : queryMenuOfUser(userId)) {
            array.add(menu.toJSONObject());
        }
        array = BaseTreeService.queryTreeGrid("menuId", "parentMenuId", array);
        removeDisableMenu(array);

        return array;
    }

    /**
     * 删除无效的菜单及其下级
     * 
     * @param array
     */
    private void removeDisableMenu(JSONArray array) {
        if (array != null) {
            for (int i = array.size() - 1; i >= 0; i--) {
                JSONObject json = array.getJSONObject(i);
                if (Constants.MENU_STATE_DISABLE.equals(json.getString("menuState"))) {// 无效
                    array.remove(json);
                } else {
                    removeDisableMenu(json.optJSONArray("children"));
                }
            }
        }
    }

    /**
     * 所有菜单和功能点
     * 
     * @return
     */
    @Override
    public List<Menu> queryAllMenuAndFunctions() {
        return menuMapper.selectAll();
    }

    /**
     * 用户权限，对于001，返回所有，否则返回有效的
     * 
     * @param userId
     * @return
     */
    @Override
    public List<Menu> queryMenuOfUser(String userId) {
        List<Menu> list = null, menus = new ArrayList<Menu>();
        if (Constants.SUPER_USER_ID.equals(userId)) {// 超级管理员
            list = menuMapper.selectAll();
        } else {
            list = menuMapper.selectMenuOfUser(userId);
        }
        Map<String, Menu> map = new HashMap<String, Menu>();
        for (Menu menu : list) {
            map.put(menu.getId(), menu);
        }
        // 隐藏无效的
        for (Menu menu : list) {
            if (Constants.MENU_STATE_ENABLE.equals(menu.getState()) && isParentEnable(map, menu.getParentId())) {
                menus.add(menu);
            }
        }
        return menus;
    }

    private boolean isParentEnable(Map<String, Menu> map, String parentId) {
        if (Constants.MENU_ROOT_ID.equals(parentId)) {// 如果上级是根节点，则是有效的
            return true;
        } else {
            Menu parent = map.get(parentId);
            if (parent == null || Constants.MENU_STATE_DISABLE.equals(parent.getState())) {// 父节点不存在或无效，肯定无效
                return false;
            }
            return isParentEnable(map, parent.getParentId());
        }
    }

    /**
     * 新增
     * 
     * @param menu
     * @return 添加的数量
     */
    @Override
    public int add(Menu menu) {
        menu.setId(intIncrementId("SYS_MENU", "MENU_ID"));// 手动设置Id
        menu.setMakeTime(new Date());
        menu.setModifyTime(menu.getMakeTime());
        if (StringUtils.isBlank(menu.getParentId())) {
            menu.setParentId("0");
        }
        return menuMapper.insert(menu);
    }

    /**
     * 修改
     * 
     * @param menu
     * @return 更新的数量
     */
    @Override
    public int update(Menu menu) {
        String menuId = menu.getId();
        if (StringUtil.isEmpty(menuId)) {
            throw new BusinessException("获取主键失败");
        }
        menu.setModifyTime(new Date());
        return menuMapper.updateByPrimaryKeySelective(menu);
    }

    /**
     * 删除
     * 
     * @param menuId
     * @return 删除的数量
     */
    @Override
    public int delete(String menuId) {
        if (StringUtil.isEmpty(menuId)) {
            throw new BusinessException("获取主键失败");
        }

        // 更新数据范围表
        dataScopeService.updateByMenuDelete(menuId);
        return menuMapper.deleteByPrimaryKey(menuId);
    }

}
